问题描述:求迷宫中从一个入口到出口的所有路径是一个经典的程序设计问题。由于计算机解迷宫时,通常用的是“穷举求解”的方法,即从入口出发,顺某一方向向前探索,若能走通,则继续往前走;否则沿原路返回,换一个方向再继续探索,直到所有可能的通路都探索到为止;假如所有可能的通路都探索到而未能到达出口,则所假定的迷宫没有解
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
typedef struct
{
int x,y;
}items;//
typedef struct
{
int x,y,d;
}Datetype;//定义移动move
typedef struct
{
Datetype data[MAX];
int top;//
}SeqStack,*PSeqStack;
//创建一个空栈
PSeqStack Init_Seqstack()
{
PSeqStack S;
S=(PSeqStack )malloc(sizeof(SeqStack));
if(S )
S->top=-1;//
return S;
}
int Empty_Seqstack(PSeqStack S)
{//
if(S->top==-1)
return 1;
else
return 0;
}
int Push_Seqstack(PSeqStack S,Datetype x)
{//
if(S->top==MAX-1)
return 0;
else
{
S->top++;
S->data[S->top]=x;
return 1;
}
}
int Pop_Seqstack(PSeqStack S,Datetype *x)
{//
if(Empty_Seqstack(S))
return 0;
else
{
*x=S->data[S->top];
S->top--;
return 1;
}
}
int Gettop_Seqstack(PSeqStack S,Datetype *x)
{//
if(Empty_Seqstack(S))
return 0;
else
*x=S->data[S->top];
return 1;
}
void Destroy_seqstack(PSeqStack *S)
{//
if(*S)
free(*S);
*S=NULL;
return ;
}
#include<stdio.h>
#include<stdlib.h>
#include"head.h"
#define m 6
#define n 8
//
int mazepath(int maze[][n+2],items move[],int x0,int y0)
{//求解迷宫问题主要程序,maze代表迷宫,x0,y0代表入口
PSeqStack S;
Datetype temp;
int x,y,d,i,j;
temp.x=x0;
temp.y=y0;
temp.d=-1;
S=Init_Seqstack();
if(!S)
{
printf("error!");
return 0;
}
Push_Seqstack(S,temp);
while(!Empty_Seqstack(S))
{
Pop_Seqstack(S,&temp);
x=temp.x;
y=temp.y;
d=temp.d+1;
while(d<4)
{
i=x+move[d].x;
j=y+move[d].y;
if(maze[i][j]==0)//如果这条路可以走
{
temp.x=x;
temp.y=y;
temp.d=d;
Push_Seqstack(S,temp);//压入栈中
x=i;y=j;maze[x][y]=-1;//
if(m==x&&n==y)//如果到达出口
{
while(!Empty_Seqstack(S))
{
Pop_Seqstack(S,&temp);//出站
printf("->(%d,%d)",temp.x,temp.y);//打印路径
}
Destroy_seqstack(&S);
return 1;//
}
else
d=0;//从新的路开始走
}
else
d++;//找下一个路径
}
}
Destroy_seqstack(&S);
return 0;
}
int main()
{
// int migong[m+2][n+2];
int i,j;
items move[4];
move[0].x=0;
move[0].y=1;
move[1].x=1;
move[1].y=0;
move[2].x=0;
move[2].y=-1;
move[3].x=-1;
move[3].y=0;
int migong[m+2][n+2]={
{1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,1,0,1,1,0,1},
{1,0,0,0,1,1,1,1,0,1},
{1,0,0,0,0,0,1,1,0,1},
{1,0,0,0,1,0,0,1,0,1},
{1,0,0,0,0,0,1,0,0,1},
{1,0,0,0,1,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1}
};
mazepath(migong,move,1,1);
return 0;
}